package org.mkdir.web.controller.admin;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.mkdir.ejb.FelhasznaloService;
import org.mkdir.model.Felhasznalo;
import org.mkdir.model.Szerepkor;
import org.mkdir.util.jsf.FacesMessageUtil;
import org.mkdir.util.jsf.MessageBundle;
import org.mkdir.web.controller.felhasznalo.FelhasznaloSessionController;

/**
 *
 * @author Alex Paréj
 */
@Named
@ViewScoped
public class FelhasznalokSzerkeszteseController implements Serializable {

    @Inject
    private FelhasznaloService felhasznaloService;
    @Inject
    private FelhasznaloSessionController felhasznaloSessionController;
    private List<Felhasznalo> felhasznalok;
    private List<Felhasznalo> filteredFelhasznalok;
    private Felhasznalo valasztottFelhasznalo;
    private boolean valasztottFelhasznaloAdmin;

    public void ujFelhasznaloListener() {
        elokeszitUjFelhasznalo();
    }

    public void aktivalInaktivalListener() {
        if (isInaktivFelhasznalo(valasztottFelhasznalo)) {
            felhasznaloService.aktival(valasztottFelhasznalo);
            uzenFelhasznaloAktivalva();
        } else {
            felhasznaloService.inaktival(valasztottFelhasznalo);
            uzenFelhasznaloInaktivalva();
        }
        valasztottFelhasznalo = null;
        resetFelhasznalok();
    }

    public boolean isInaktivFelhasznalo(Felhasznalo felhasznalo) {
        return felhasznaloService.isSzerepkorben(felhasznalo, Szerepkor.INAKTIV);
    }

    public boolean isInaktivValasztottFelhasznalo() {
        return valasztottFelhasznalo != null && isInaktivFelhasznalo(valasztottFelhasznalo);
    }

    public void mentFelhasznaloListener() {
        if (valasztottFelhasznalo.isUj()) {
            letrehozFelhasznalo();
            uzenFelhasznaloLetrehozva();
            valasztottFelhasznalo = null;
        } else {
            szerkesztFelhasznalo();
            uzenFelhasznaloElmentve();
        }
        resetFelhasznalok();
    }

    public Felhasznalo getValasztottFelhasznalo() {
        return valasztottFelhasznalo;
    }

    public void setValasztottFelhasznalo(Felhasznalo valasztottFelhasznalo) {
        this.valasztottFelhasznalo = valasztottFelhasznalo;
        letoltValasztottFelhasznaloAdmin();
    }

    public List<Felhasznalo> getFelhasznalok() {
        if (felhasznalok == null) {
            letoltFelhasznalok();
        }
        return felhasznalok;
    }

    public boolean isKivalasztvaFelhasznalo() {
        return valasztottFelhasznalo != null && !valasztottFelhasznalo.isUj();
    }

    public boolean isValasztottFelhasznaloAdmin() {
        return valasztottFelhasznaloAdmin;
    }

    public void setValasztottFelhasznaloAdmin(boolean valasztottFelhasznaloAdmin) {
        this.valasztottFelhasznaloAdmin = valasztottFelhasznaloAdmin;
    }

    public void generalUjJelszoListener() {
        felhasznaloService.generalUjJelszo(valasztottFelhasznalo);
        uzenUjJelszoGeneralva();
    }

    public List<Felhasznalo> getFilteredFelhasznalok() {
        return filteredFelhasznalok;
    }

    public void setFilteredFelhasznalok(List<Felhasznalo> filteredFelhasznalok) {
        this.filteredFelhasznalok = filteredFelhasznalok;
    }

    private void resetFelhasznalok() {
        felhasznalok = null;
    }

    private void elokeszitUjFelhasznalo() {
        valasztottFelhasznalo = felhasznaloService.getAlapertelmezettFelhasznaloMinta();
        valasztottFelhasznaloAdmin = false;
    }

    private void letoltFelhasznalok() {
        felhasznalok = felhasznaloService.getOsszesFelhasznalo();
    }

    private void letrehozFelhasznalo() {
        felhasznaloService.letrehoz(valasztottFelhasznalo, felhasznaloSessionController.getFelhasznalo(), getValasztottFelhasznaloSzerepkorok());
    }

    private void szerkesztFelhasznalo() {
        felhasznaloService.modosit(valasztottFelhasznalo, getValasztottFelhasznaloSzerepkorok());
    }

    private void letoltValasztottFelhasznaloAdmin() {
        if (valasztottFelhasznalo == null) {
            valasztottFelhasznaloAdmin = false;
        } else {
            valasztottFelhasznaloAdmin = felhasznaloService.isSzerepkorben(valasztottFelhasznalo, Szerepkor.ADMIN);
        }
    }

    private Collection<Szerepkor> getValasztottFelhasznaloSzerepkorok() {
        if (valasztottFelhasznalo == null) {
            return null;
        }
        Collection<Szerepkor> szerepkorok = new ArrayList<Szerepkor>();
        szerepkorok.add(Szerepkor.FELHASZNALO);
        if (valasztottFelhasznaloAdmin) {
            szerepkorok.add(Szerepkor.ADMIN);
        }
        return szerepkorok;
    }

    private void uzenFelhasznaloInaktivalva() {
        FacesMessageUtil.addInfoMessage(MessageBundle.getMessage("inaktivalva"), valasztottFelhasznalo.getEmail());
    }

    private void uzenFelhasznaloAktivalva() {
        FacesMessageUtil.addInfoMessage(MessageBundle.getMessage("aktivalva"), valasztottFelhasznalo.getEmail());
    }

    private void uzenFelhasznaloLetrehozva() {
        FacesMessageUtil.addInfoMessage(MessageBundle.getMessage("letrehozva"), valasztottFelhasznalo.getEmail());
    }

    private void uzenFelhasznaloElmentve() {
        FacesMessageUtil.addInfoMessage(MessageBundle.getMessage("modositva"), valasztottFelhasznalo.getEmail());
    }

    private void uzenUjJelszoGeneralva() {
        FacesMessageUtil.addInfoMessage(MessageBundle.getMessage("ujJelszoGeneralva"), valasztottFelhasznalo.getEmail());
    }
}
